package qc.module.platform.api.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.exception.QCPromptException;
import qc.module.platform.dto.dbTable.DBTableDto;
import qc.module.platform.dto.dbTable.DBTableFullDto;
import qc.module.platform.dto.dbTable.DBTableQueryConditionDto;
import qc.module.platform.dto.dbTableColumn.DBTableColumnDto;
import qc.module.platform.entity.QcDbTableColumn;
import qc.module.platform.mapper.DBTableColumnMapper;
import qc.module.platform.service.*;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * DbTableController
 *
 * @author QuCheng Tech
 * @since 2024/1/29
 */
@RestController
@RequestMapping("/dbtable")
public class DbTableController {
    @Autowired
    private DbTableService service;

    @Autowired
    private DbService dbService;

    @Autowired
    private DbTableColumnService columnService;

    @Autowired
    private DbTableSqlService sqlService;

    @Autowired
    private DbTableDataService dbTableDataService;

    /**
     * 查询，根据分类编码和关键字查询，均可以为空
     *
     * @param conditionDto 查询条件对象
     * @return 返回数据库表信息集合
     * @author QuCheng
     * @since 2024/3/13
     */
    @RequestMapping(value = "/query", method = {RequestMethod.GET, RequestMethod.POST})
    public List<DBTableDto> query(@RequestBody DBTableQueryConditionDto conditionDto){
        return service.query(conditionDto);
    }

    /**
     * 获取指定数据库表信息——支持RequestParam方式
     * @param id 数据库表编码
     * @return 返回指定数据库表信息
     * @author QuCheng
     * @since 2024/3/13
     */
    @GetMapping("/get")
    public DBTableDto getByParam(@RequestParam String id) throws QCPromptException {
        return service.get(id);
    }

    /**
     * 获取指定数据库表信息——支持PathVariable方式
     * @param id 数据库表编码
     * @return 返回指定数据库表信息
     * @author QuCheng
     * @since 2024/3/13
     */
    @GetMapping("/get/{id}")
    public DBTableDto getByPath(@PathVariable String id) throws QCPromptException {
        return service.get(id);
    }

    /**
     * 获取指定表的完整信息，包含表基本信息、数据库信息、列信息、sql信息
     *
     * @param id 表编码
     * @return java.util.List<qc.module.platform.dto.dbTableSql.DBTableSqlDto>
     * @author QuCheng Tech
     * @since 2024/1/29
     */
    @GetMapping("/getfull")
    public DBTableFullDto getFullInfoByParam(@RequestParam(name = "id", required = true) String id) throws QCPromptException, SQLException {
        return getTableFullInfo(id);
    }

    /**
     * 获取指定表的完整信息，包含表基本信息、数据库信息、列信息、sql信息
     *
     * @param id 表编码
     * @return java.util.List<qc.module.platform.dto.dbTableSql.DBTableSqlDto>
     * @author QuCheng Tech
     * @since 2024/1/29
     */
    @GetMapping("/getfull/{id}")
    public DBTableFullDto getFullInfoByPath(@PathVariable(name = "id", required = true) String id) throws QCPromptException, SQLException {
        return getTableFullInfo(id);
    }

    /**
     * 获取指定表的完整信息，包含表基本信息、数据库信息、列信息、sql信息
     *
     * @param tableCode 表编码
     * @return qc.module.platform.dto.dbTable.DBTableFullDto
     * @author QuCheng Tech
     * @since 2024/2/1
     */
    DBTableFullDto getTableFullInfo(String tableCode) throws QCPromptException, SQLException {
        DBTableDto table = service.get(tableCode);
        if (table != null && !StringUtils.isBlank(table.getCode())) {
            DBTableFullDto result = new DBTableFullDto();
            result.setTable(table);
            //获取数据库信息
            result.setDb(dbService.get(table.getDb()));
            //获取表的列信息，读取列信息同时包含列数据在编辑时提供的待选择数据列表信息
            List<QcDbTableColumn> columnEntitys = columnService.getTableColumnEntitys(tableCode, false,"qrodr");
            if (columnEntitys != null && columnEntitys.size() > 0x0) {
                List<DBTableColumnDto> items = new ArrayList<>();

                for (QcDbTableColumn column : columnEntitys) {
                    DBTableColumnDto columnDto = DBTableColumnMapper.MAPPER.toDto(column);
                    //列的待选择数据需要单独处理
                    columnDto.setOptions(dbTableDataService.getColumnOptions(column.getColtype(), column.getValrange()));

                    items.add(columnDto);
                }

                result.setColumns(items);
            }
            //获取表的sql信息
            result.setSqls(sqlService.getTableAllSqls(tableCode, true));

            return result;
        }

        return null;
    }

    /**
     * 新增
     * @param dto
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng
     * @since 2024/3/13
     */
    @RequestMapping(value = "/add",method = {RequestMethod.GET,RequestMethod.POST})
    public String add(@RequestBody DBTableDto dto){
        return service.add(dto);
    }

    /**
     * 修改
     * @param dto
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng
     * @since 2024/3/13
     */
    @RequestMapping(value = "/update",method = {RequestMethod.POST,RequestMethod.PUT})
    public String update(@RequestBody DBTableDto dto){
        return service.update(dto);
    }

    /**
     * 删除——支持RequestParam，同时删除数据库表sql和数据库表列中的信息。
     * @param id 数据库代码
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng
     * @since 2024/3/13
     */
    @DeleteMapping("/delete")
    public String deleteByParam(@RequestParam String id) throws QCPromptException {
        return service.delete(id);
    }

    /**
     * 删除——支持PathVariable，同时删除数据库表sql和数据库表列中的信息。
     * @param id 数据库代码
     * @return 成功返回null，失败返回错误信息
     * @author QuCheng
     * @since 2024/3/13
     */
    @DeleteMapping("/delete/{id}")
    public String deleteByPath(@PathVariable String id) throws QCPromptException {
        return service.delete(id);
    }
}
